#include "app_modbus.h"

static modbus_t *modbus;
gate_state_t app_modbus_init(void)
{
    // 1. 创建modbus上下文
    modbus = modbus_new_rtu("/dev/ttyS1", 115200, 'N', 8, 1);

    if (modbus == NULL)
    {
        log_error("创建modbus上下文失败\n");
        return GATE_ERROR;
    }

    modbus_set_debug(modbus, true); // 在测试时,开启debug模式, 生产环境要关闭
    log_info("创建modbus上下文成功\n");

    // 2. 连接 (对rtu来说, 其实就是使能串口)
    if (modbus_connect(modbus) == -1)
    {
        log_error("modbus连接失败\n");
        modbus_free(modbus);
        return GATE_ERROR;
    }
    log_info("modbus连接成功\n");

    log_info("modbus初始化成功\n");

    return GATE_OK;
}

// 设置转速: 写转速到保持寄存器0
gate_state_t app_modbus_write_single_holde_register(uint8_t slave_addr, uint16_t speed)
{
    // 设置从机地址
    modbus_set_slave(modbus, slave_addr);

    int r = modbus_write_register(modbus, 0, speed);
    if (r == -1)
    {
        log_error("modbus_write_register失败\n");
        return GATE_ERROR;
    }
    log_info("modbus_write_register成功\n");
    return GATE_OK;
}

// 获取转速; 从输入寄存器0读取数据
gate_state_t app_modbus_read_single_input_register(uint8_t slave_addr, uint16_t *speed)
{
    modbus_set_slave(modbus, slave_addr);

    int r = modbus_read_input_registers(modbus, 0, 1, speed);
    if (r == -1)
    {
        log_error("modbus_read_input_registers失败\n");
        return GATE_ERROR;
    }
    log_info("modbus_read_input_registers成功\n");
    return GATE_OK;
}
